package modules.java8.optional3;

import modules.dao.UserRepository;
import modules.entities.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;
import java.util.Optional;

/**
 * Optional 是容器类
 *      处理空指针异常
 *
 * @author shengren.yan
 * @create 2021-03-16
 */
@SpringBootTest
public class Optional1 {

    @Autowired
    private UserRepository userRepository;

    // Optional 是容器类  处理空指针异常
    @Test
    void test10() {

        // 创建一个  Optional
        Optional<User> user1 = Optional.of(new User());
        System.out.println(user1);

        // 创建一个  空  Optional
        Optional<User> user2 = Optional.empty();
        System.out.println(user2);

        // 创建一个  Optional
        Optional<User> user3 = Optional.ofNullable(new User());
        System.out.println(user3);

        // 判断是否包含值  true 有值  false 没有值
        if (user3.isPresent()) {
            System.out.println("判断是否包含值");
            System.out.println(user3.get());
        }

        List<User> list = userRepository.findAll();
        list.forEach(System.out::println);

        // 判断对象是否有值，有返回该值，否则返回 默认值 s  orElse(这里就是默认值)
        System.out.println("----------------");
        User userObj = list.get(2);
        System.out.println(userObj);
        Optional<User> user4 = Optional.of(userObj);
        User user5 = user4.orElse(list.get(3));
        System.out.println(user5);


        // 判断对象是否有值，有返回该值，否则返回 默认值 s  orElseGet(这里就是默认值)
        System.out.println("----------------");
        User user6 = user4.orElseGet(() -> {
            return new User();
        });
        System.out.println(user6);

        // 如果有值，对值进行处理，否则返回空 Optional
        System.out.println("----------------");
        Optional<String> user7 = user4.map((e) -> {
            return e.getUsername();
        });
        System.out.println(user7);

        // flatMap  这个跟map 类似  如果有值，对值进行处理，但返回是Optional，否则返回空 Optional

    }

}
